package atom.core0.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

import org.apache.log4j.Logger;

public class JdbcManager
{
	/** Oracle数据库连接驱动 */
	private static String	  DB_DRIVER	   = "oracle.jdbc.driver.OracleDriver";
	private static Logger	  logger	   = Logger.getLogger(JdbcManager.class);
	private Connection	      conn	       = null;
	private Statement	      statement	   = null;
	private PreparedStatement	statement2	= null;

	// oracle mysql
	private static void setDBType(String dbtype)
	{
		if (dbtype.equals("oracle"))
			DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
		else if (dbtype.equals("mysql"))
			DB_DRIVER = "com.mysql.jdbc.Driver";
	}

	// 获得连接
	// jdbc:oracle:thin:@127.0.0.1:1521:orcl
	// jdbc:mysql://localhost:3306/mytest
	public Connection getConnection(String url, String username, String password) throws Exception
	{
		Class.forName(DB_DRIVER);
		conn = DriverManager.getConnection(url, username, password);
		conn.setAutoCommit(false);
		logger.info("JdbcManager getConnection连接数据库成功");

		return conn;
	}

	public void closeConnection()
	{
		try
		{
			if (statement != null)
			{
				/** 判断当前连接连接对象如果没有被关闭就调用关闭方法 */
				statement.close();
				statement = null;
			}
			if (conn != null)
			{
				/** 判断当前连接连接对象如果没有被关闭就调用关闭方法 */
				if (!conn.isClosed())
				{
					logger.info("JdbcManager closeConnection断开数据库连接成功");
					conn.close();
					conn = null;
				}
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			return;
		}
	}

	/*
	 * 关闭Statement 传入参数： 无
	 * 
	 * 返回值： 无
	 */
	public void closeStatement()
	{
		try
		{
			// System.out.println("in closeStatement");

			if (statement != null)
			{
				/** 判断当前连接连接对象如果没有被关闭就调用关闭方法 */
				statement.close();
				statement = null;
			}
			if (statement2 != null)
			{
				/** 判断当前连接连接对象如果没有被关闭就调用关闭方法 */
				statement2.close();
				statement2 = null;
			}
			return;
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			return;
		}
	}

	/*
	 * 执行查询 传入参数： strSql：要执行的sql语句
	 * 
	 * 返回值： 执行成功则返回结果集，否则返回null；
	 */
	public ResultSet doQuery(String strSql)
	{
		try
		{
			// logger.info("in doQuery["+strSql+"]");
			if (conn == null)
			{
				return null;
			}
			if (statement == null)
			{
				statement = conn.createStatement();
			}
			return statement.executeQuery(strSql);
		}
		/*
		 * catch(SQLException e){ e.printStackTrace();
		 * //对于加了“nowait”参数的语句，如果因其他连接先锁定了记录而本连接无法锁定
		 * ，则e.getErrorCode()为“54”，e.getSQLState()为“61000”
		 * logger.info("exp：["+e.
		 * getErrorCode()+"],["+e.getSQLState()+"],["+e.toString()+"]"); return
		 * null; }
		 */
		catch (Exception e)
		{
			logger.info("doQuery发生异常：" + e.toString());
			e.printStackTrace();
			StackTraceElement[] messages = e.getStackTrace();
			int length = messages.length;
			logger.info("具体异常信息：");
			for (int i = 0; i < length; i++)
			{
				logger.info("ClassName:" + messages[i].getClassName());
				logger.info("getFileName:" + messages[i].getFileName());
				logger.info("getLineNumber:" + messages[i].getLineNumber());
				logger.info("getMethodName:" + messages[i].getMethodName());
				logger.info("toString:" + messages[i].toString());
			}
			logger.info("-------------------------------------");

			return null;
		}
	}

	/*
	 * 执行查询 传入参数： strSql：要执行的sql语句
	 * 
	 * 返回值： 执行成功则返回结果集，否则返回null；
	 */
	public ResultSet doQuery(String strSql, List parm)
	{
		try
		{
			if (conn == null)
			{
				return null;
			}
			if (statement2 == null)
			{
				statement2 = conn.prepareStatement(strSql);
				if (parm != null)
				{
					for (int i = 0; i < parm.size(); i++)
					{
						Object obj = parm.get(i);
						statement2.setObject(i, obj);
						// if (obj instanceof String)
						// statement2.setString(i, (String)obj);
						// else if (obj instanceof Long)
						// statement2.setLong(i, (Long)obj);
						// else if (obj instanceof Integer)
						// statement2.setInt(i, (Integer)obj);
						// else if (obj instanceof Double)
						// statement2.setDouble(i, (Double)obj);

					}
				}
			}
			ResultSet rs = statement2.executeQuery();
			return rs;
		}
		/*
		 * catch(SQLException e){ e.printStackTrace();
		 * //对于加了“nowait”参数的语句，如果因其他连接先锁定了记录而本连接无法锁定
		 * ，则e.getErrorCode()为“54”，e.getSQLState()为“61000”
		 * logger.info("exp：["+e.
		 * getErrorCode()+"],["+e.getSQLState()+"],["+e.toString()+"]"); return
		 * null; }
		 */
		catch (Exception e)
		{
			logger.info("doQuery发生异常：" + e.toString());
			e.printStackTrace();
			StackTraceElement[] messages = e.getStackTrace();
			int length = messages.length;
			logger.info("具体异常信息：");
			for (int i = 0; i < length; i++)
			{
				logger.info("ClassName:" + messages[i].getClassName());
				logger.info("getFileName:" + messages[i].getFileName());
				logger.info("getLineNumber:" + messages[i].getLineNumber());
				logger.info("getMethodName:" + messages[i].getMethodName());
				logger.info("toString:" + messages[i].toString());
			}
			logger.info("-------------------------------------");

			return null;
		}
	}

	/*
	 * 执行更新 传入参数： strSql：要执行的sql语句
	 * 
	 * 返回值： 执行成功则返回影响到的记录数，否则返回-1；
	 * 
	 * 说明： update、delete、insert语句都通过此函数执行
	 */
	public int doUpdate(String strSql)
	{
		try
		{
			// logger.info("in doUpdate["+strSql+"]");
			if (conn == null)
			{
				return -1;
			}
			if (statement == null)
			{
				statement = conn.createStatement();
			}
			return statement.executeUpdate(strSql);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			logger.info("doUpdate发生异常：" + e.toString());
			StackTraceElement[] messages = e.getStackTrace();
			int length = messages.length;
			logger.info("具体异常信息：");
			for (int i = 0; i < length; i++)
			{
				logger.info("ClassName:" + messages[i].getClassName());
				logger.info("getFileName:" + messages[i].getFileName());
				logger.info("getLineNumber:" + messages[i].getLineNumber());
				logger.info("getMethodName:" + messages[i].getMethodName());
				logger.info("toString:" + messages[i].toString());
			}
			logger.info("-------------------------------------");
			return -1;
		}
	}

	/*
	 * 提交事务 传入参数： 无
	 * 
	 * 返回值： 无
	 */
	public void doCommit()
	{
		try
		{
			System.out.println("in doCommit");
			if (conn != null)
			{
				conn.commit();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
			logger.info("doCommit发生异常：" + e.toString());
			StackTraceElement[] messages = e.getStackTrace();
			int length = messages.length;
			logger.info("具体异常信息：");
			for (int i = 0; i < length; i++)
			{
				logger.info("ClassName:" + messages[i].getClassName());
				logger.info("getFileName:" + messages[i].getFileName());
				logger.info("getLineNumber:" + messages[i].getLineNumber());
				logger.info("getMethodName:" + messages[i].getMethodName());
				logger.info("toString:" + messages[i].toString());
			}
			logger.info("-------------------------------------");
			return;
		}
	}

	/*
	 * 回滚事务 传入参数： 无
	 * 
	 * 返回值： 无
	 */
	public void doRollback()
	{
		try
		{
			System.out.println("in doRollback");
			if (conn != null)
			{
				conn.rollback();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
			logger.info("doRollback发生异常：" + e.toString());
			StackTraceElement[] messages = e.getStackTrace();
			int length = messages.length;
			logger.info("具体异常信息：");
			for (int i = 0; i < length; i++)
			{
				logger.info("ClassName:" + messages[i].getClassName());
				logger.info("getFileName:" + messages[i].getFileName());
				logger.info("getLineNumber:" + messages[i].getLineNumber());
				logger.info("getMethodName:" + messages[i].getMethodName());
				logger.info("toString:" + messages[i].toString());
			}
			logger.info("-------------------------------------");
			return;
		}
	}

	public Connection getConnection()
	{
		return conn;
	}
}
